package com.common.utils;




import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;


import java.awt.image.RasterFormatException;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.SignatureException;
import java.time.Instant;
import java.util.*;

/*
jwt被点号分成了三部分 第一部分是typ token的类型 和 alg算法的名称
payLoad sub标准中注册的声明  name公共的声明 admin私有的声明
signature是第三部分 将第一二部分用点号拼接再用第一部分的算法加密 生成第三部分
 */
@Component
public class JwtUtils {

//     private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    private static final String secretKey = "11451419198101145141919810114514191981011451419198101145141919810114514191981011451419198101145141919810114514191981011451419198101145141919810114514191981011451419198101145141919810114514191981011451419198101145141919810114514191981011451419198101145141919810";
    //key是20个1145141919810
    private static final long EXPIRATION = 5* 60 * 1000;

//    public static synchronized String generate(Map<String, Object> claims) {
////        System.out.println("我是Key:"+key);
//        return Jwts.builder()
//                .setHeaderParam("alg", "HS256")
//                .setHeaderParam("typ", "JWT")
//                .setClaims(claims)
//                .signWith(SignatureAlgorithm.HS256, secretKey)
//                .compact();
//    }
// 1. 将字符串密钥转换为字节数组（必须 UTF-8 编码）
//    byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8);
//
//    // 2. 根据签名算法生成 Key 对象（这里假设是 HS256）
//    Key key = Keys.hmacShaKeyFor(keyBytes);

    public static synchronized String generate(Map<String, Object> claims) {
//        System.out.println("我是Key:"+key);
        return Jwts.builder()
                .setHeaderParam("alg", "HS256")
                .setHeaderParam("typ", "JWT")
                .setClaims(claims)
//                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }

////    /
//     *
//     * @param jwt       JWT数据
//     * @param secretKey 生成JWT时使用的密钥
//     * @return 解析结果
//     */

    public static synchronized Claims parse(String jwt, String secretKey) {
        try {
            Key key = Keys.hmacShaKeyFor(Base64.getDecoder().decode(secretKey));
//        return Jwts.parser()
//                .setSigningKey(secretKey)
//                .parseClaimsJws(jwt)
//                .getBody();
            // 3. 使用新版 parserBuilder 构建解析器

            return Jwts.parser()
                    .setSigningKey(key) // 必须传入 Key 对象，而非字符串
                    .setClock(() -> new Date(0))
//                    .requireExpiration(new Date())
                    .build()
                    .parseClaimsJws(jwt)
                    .getBody();


//        }catch (SignatureException e) {
//            // 签名验证失败异常，比如密钥不匹配
//            throw new IllegalArgumentException("JWT 签名无效", e);
        } catch (MalformedJwtException e) {
            // JWT 格式错误异常
            throw new IllegalArgumentException("JWT 格式不正确", e);
        }catch (ExpiredJwtException e){
            throw e;
        }
//        }catch (Exception e){
//            return Optional.empty();
//        }
    }

//    public static void main(String[] args) {
//        User user=new User();
//        user.setName("我是User");
//        user.setPassword("我是password");
//        Map<String,Object> map=new HashMap<>();
//        map.put("user",user);
//        String generate = JwtUtils.generate(map, secretKey);
//        System.out.println(generate);
//        Claims jwt=JwtUtils.parse(generate,secretKey);
//        System.out.println(jwt);
//
//
//    }



//    //算法生成key
//    private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
//    private static final long EXPIRATION_TIME = 300000; // 5分钟
//    String secret = System.getenv("JWT_SECRET");
//    Key key = Keys.hmacShaKeyFor(secret.getBytes());
//    String base64Key = java.util.Base64.getEncoder().encodeToString(key.getEncoded());
//



//    public void createToken(Map<String> claims, Date date){
//        // 2. 生成Token
//        return Jwts.builder()
//                .setClaims(claims)                      // 自定义Claims
////                .setSubject("user@example.com")         // 主题
//                .setIssuedAt(new Date())                // 签发时间
//                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 过期时间
//                .signWith(SECRET_KEY)                   // 签名算法和密钥
//                .compact();                             // 生成字符串形式的Token
//    }

//    // 解析Token
//    public static void parseToken(String token) {
//        try {
//            Jws<Claims> claimsJws = Jwts.parserBuilder()
//                    .setSigningKey(SECRET_KEY)
//                    .build()
//                    .parseClaimsJws(token);
//
//            Claims claims = claimsJws.getBody();
//            System.out.println("Subject: " + claims.getSubject());
//            System.out.println("UserID: " + claims.get("userId"));
//            System.out.println("Role: " + claims.get("role"));
//            System.out.println("Expiration: " + claims.getExpiration());
//
//        } catch (JwtException e) {
//            System.err.println("Token解析失败: " + e.getMessage());
//        }
//    }
//

}
